home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1997 February / EnigmA AMIGA RUN 15 (1997)(G.R. Edizioni)(IT)[!][issue 1997-02][PLANET CD V].iso / progs / sviluppo / pike-0.4.0 / lib / include / fifo.pre.pike < prev    next >
Text File  |  1997-01-10  |  2KB  |  73 lines

  1. void create()
  2. {
  3.   master()->add_precompiled_program("/precompiled/fifo", class {
  4.     inherit "/precompiled/condition": r_cond;
  5.     inherit "/precompiled/condition": w_cond;
  6.     inherit "/precompiled/mutex": lock;
  7.  
  8.     mixed *buffer;
  9.     int r_ptr, w_ptr;
  10.  
  11.     int size() {  return (w_ptr+sizeof(buffer) - r_ptr) % sizeof(buffer);  }
  12.     
  13.     mixed read()
  14.     {
  15.       mixed tmp;
  16.       object key=lock::lock();
  17.       while(!size()) r_cond::wait(key);
  18.       tmp=buffer[r_ptr];
  19.       if(++r_ptr >= sizeof(buffer)) r_ptr=0;
  20.       w_cond::signal();
  21.       return tmp;
  22.     }
  23.  
  24.     void write(mixed v)
  25.     {
  26.       object key=lock::lock();
  27.       while(size() == sizeof(buffer)) w_cond::wait(key);
  28.       buffer[w_ptr]=v;
  29.       if(++w_ptr >= sizeof(buffer)) r_ptr=0;
  30.       r_cond::signal();
  31.     }
  32.  
  33.     varargs void create(int size)
  34.     {
  35.       buffer=allocate(size || 128);
  36.     }
  37.   });
  38.  
  39.   master()->add_precompiled_program("/precompiled/queue", class {
  40.     inherit "/precompiled/condition": r_cond;
  41.     inherit "/precompiled/mutex": lock;
  42.  
  43.     mixed *buffer=allocate(16);
  44.     int r_ptr, w_ptr;
  45.  
  46.     int size() {  return w_ptr - r_ptr;  }
  47.     
  48.     mixed read()
  49.     {
  50.       mixed tmp;
  51.       object key=lock::lock();
  52.       while(!size()) r_cond::wait(key);
  53.       tmp=buffer[r_ptr++];
  54.       return tmp;
  55.     }
  56.  
  57.     void write(mixed v)
  58.     {
  59.       object key=lock::lock();
  60.       if(w_ptr >= sizeof(buffer))
  61.       {
  62.     buffer=buffer[r_ptr..];
  63.     buffer+=allocate(sizeof(buffer)+1);
  64.     w_ptr-=r_ptr;
  65.     r_ptr=0;
  66.       }
  67.       buffer[w_ptr]=v;
  68.       w_ptr++;
  69.       r_cond::signal();
  70.     }
  71.   });
  72. }
  73.